/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Esta clase representa a la factoria de conexiones con la base de datos,
 * implementada a través de un patrón singleton en una base de datos MySQL.
 * @author Nahuel
 */
public class MySQLDAOFactory {

    /**
     * Este es el nombre del driver utilizado para esta base de datos
     */
    public static String DRIVER = "org.gjt.mm.mysql.Driver";
    /**
     * Esta es la dirección en la que se encuentra la base de datos
     */
    public static String DBURL = "jdbc:mysql://localhost:3306/lecunadb";
    /**
     * Esta es la dirección en la que se encuentra la base de datos
     */
    public static String DBUSR = "root";
    /**
     * Esta es la dirección en la que se encuentra la base de datos
     */
    public static String DBPASS = "";
    /**
     * Este atributo permite la implementación del patrón singleton
     */
    private static MySQLDAOFactory factory = null;

    /**
     * Este mensaje es la implementación del patrón Singleton
     * @return objeto de la clase MySQLDAOFactory
     * @throws DAOException excepción de la capa DAO de la aplicación
     */
    public static MySQLDAOFactory getMySQLDAOFactory() throws DAOException {
        if (factory == null) {
            factory = new MySQLDAOFactory();
        }
        return factory;
    }

    /**
     * Este es el constructor de la clase, en el se carga el driver de la base
     * de datos
     * @throws DAOException
     */
    public MySQLDAOFactory() throws DAOException {
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException ex) {
            throw new DAOException("No se encontro el driver", ex);
        }
    }

    /**
     * Este método devuelve la conexión con la base de datos
     * @return conexión a la base de datos
     * @throws DAOException excepción de la capa DAO de la aplicación
     */
    public Connection getConexion() throws DAOException {
        try {
            return DriverManager.getConnection(DBURL, DBUSR, DBPASS);
        } catch (SQLException ex) {
            throw new DAOException("Error al acceso a la base de datos", ex);
        }
    }

    /**
     * Este método cierra la conexión con la base de datos
     * @param conexion conexión a la base de datos
     * @throws DAOException excepción de la capa DAO de la aplicación
     */
    public void cerrarConexion(Connection conexion) throws DAOException {
        try {
            conexion.close();
        } catch (SQLException ex) {
            throw new DAOException("Error al cerrar la base de datos", ex);
        }
    }

    /**
     * Este método devuelve una Agenda que se comunica con la tabla agenda de
     * la base de datos
     * @return objeto de la clase MySQLAgendaDAO
     */
    public MySQLAgendaDAO getAgendaDAO() {
        return new MySQLAgendaDAO();
    }

    /**
     * Este método devuelve una Persona que se comunica con la tabla persona de
     * la base de datos
     * @return objeto de la clase MySQLPersonaDAO
     */
    public MySQLPersonaDAO getPersonaDAO() {
        return new MySQLPersonaDAO();
    }

    /**
     * Este método devuelve una Venta que se comunica con la tabla venta de
     * la base de datos
     * @return objeto de la clase MySQLVentaDAO
     */
    public MySQLVentaDAO getVentaDAO() {
        return new MySQLVentaDAO();
    }

    /**
     * Este método devuelve una Moto que se comunica con la tabla moto de
     * la base de datos
     * @return objeto de la clase MySQLMotoDAO
     */
    public MySQLMotoDAO getMotoDAO() {
        return new MySQLMotoDAO();
    }

    /**
     * Este método devuelve una Plan que se comunica con la tabla plan de
     * la base de datos
     * @return objeto de la clase MySQLPlanDAO
     */
    public MySQLPlanDAO getPlanDAO() {
        return new MySQLPlanDAO();
    }

    /**
     * Este método devuelve una Cuota que se comunica con la tabla cuota de
     * la base de datos
     * @return objeto de la clase MySQLCuotaDAO
     */
    public MySQLCuotaDAO getCuotaDAO() {
        return new MySQLCuotaDAO();
    }

    /**
     * Este método devuelve una Pago que se comunica con la tabla pago de
     * la base de datos
     * @return objeto de la clase MySQLPagoDAO
     */
    public MySQLPagoDAO getPagoDAO() {
        return new MySQLPagoDAO();
    }

    /**
     * Este método permite testear la conexión con la base de datos, aconsejable
     * utilizarlo al inicio de la ejecución del programa
     * @throws DAOException 
     */
    
    public MySQLCajaChicaDAO getCajaChicaDAO() {
        return new MySQLCajaChicaDAO();
    }

    public MySQLRepuestosServicesMotoEntregaDAO getRepuestosServicesMotoEntregaDAO() {
        return new MySQLRepuestosServicesMotoEntregaDAO();
    }
     public MySQLMotoCuotaDAO getMotoCuotaDAO() {
        return new MySQLMotoCuotaDAO();
    }
     
    public MySQLMorososDAO getMorososDAO(){
        return new MySQLMorososDAO();
    }
 public void testConexion() throws DAOException {
        try {
            Connection conexion = this.getConexion();
            this.cerrarConexion(conexion);
        } catch (DAOException ex) {
            throw new DAOException("Error en la conexión con la base de datos", ex);
        }
    }
   
    public static void setDBURL(String DBURL) {
        MySQLDAOFactory.DBURL = DBURL;
    }

    public static void setDBUSR(String DBUSR) {
        MySQLDAOFactory.DBUSR = DBUSR;
    }

    public static void setDBPASS(String DBPASS) {
        MySQLDAOFactory.DBPASS = DBPASS;
    }

    /**
     * Este método devuelve un InformeDiario
     * @return objeto de la clase InformeDiario
     */
    public InformeDiario getInformeDIario() {
        return new InformeDiario();
    }
    
    /**
     * Este método devuelve un InformeDiario
     * @return objeto de la clase InformeDiario
     */
    public InfoClieMes getInfoClieMes() {
        return new InfoClieMes();
    }
}
